
import axios from 'axios';
import { error } from 'shelljs';
import { Toast } from 'vant';
// 环境的切换
if (process.env.NODE_ENV == 'development') {    
    axios.defaults.baseURL = '/host';
} else if (process.env.NODE_ENV == 'debug') {    
    axios.defaults.baseURL = '';
} else if (process.env.NODE_ENV == 'production') {    
    axios.defaults.baseURL = 'http://47.107.229.206:8866';
}
// 请求超时时间
axios.defaults.timeout = 10000;

// 默认请求头
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencodedcharset=UTF-8'
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

//请求拦截器
axios.interceptors.request.use(    
    config => {
        // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
        // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
        const token = sessionStorage.getItem('userInfo')&&JSON.parse(sessionStorage.getItem('userInfo')).token || ''        
        token && (config.headers.Authorization = token);        
        return config;    
    },    
    error => {        
        return Promise.error(error);    
    }
)
/** 
 * 跳转登录页
 * 携带当前页面路由，以期在登录页面完成登录后返回当前页面
 */
const toLogin = () => {
    router.replace({
        path: '/login',        
        query: {
            redirect: router.currentRoute.fullPath
        }
    });
}
// 响应拦截器
axios.interceptors.response.use(    
    response => {        
        if (response.status === 200) {            
            return Promise.resolve(response);        
        } else {            
            return Promise.reject(response);        
        }    
    },
    // 服务器状态码不是200的情况    
    error => {        
        console.log(error)
        if (error.response.status) {            
            switch (error.response.status) {                
                // 401: 未登录                
                // 未登录则跳转登录页面，并携带当前页面的路径                
                // 在登录成功后返回当前页面，这一步需要在登录页操作。                
                case 401:                    
                    toLogin();
                    break;
                // 403 token过期                
                // 登录过期对用户进行提示                
                // 清除本地token和清空vuex中token对象                
                // 跳转登录页面                
                case 403:                     
                    Toast({                        
                        message: '登录过期，请重新登录',                        
                        duration: 1000,                        
                        forbidClick: true                    
                    });                    
                    // 清除token                    
                    sessionStorage.removeItem('token');                    
                   // store.commit('loginSuccess', null);                    
                    // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
                    setTimeout(() => {                        
                        toLogin();                
                    }, 1000);                    
                    break; 
                // 404请求不存在                
                case 404:                    
                    Toast({                        
                        message: '网络请求不存在',                        
                        duration: 1500,                        
                        forbidClick: true                    
                    });                    
                break;                
                // 其他错误，直接抛出错误提示                
                default:                    
                    Toast({                        
                        message: error.response.data.message,                        
                        duration: 1500,                        
                        forbidClick: true                    
                    });            
            }            
            return Promise.reject(error.response);        
        }       
    }
);
export default {

    /**
     * 封装请求方式
     * @api {
     *  type:请求类型
     *  url:请求地址
     *  formData:是否使用formDate格式入参  true 启用  false 不启用
     * }
     * @request 数据
     */
    
    server(api,request ={}) {
        
        return new Promise((resolve,reject) => {
            if(api.type == 'get' || api.type =='delete') {
                return axios({
                    url: api.url.indexOf('?') == '-1'? api.url + '?t=' + new Date().getTime() : api.url + '&t=' + new Date().getTime(), // 清缓存
                    method: api.type,
                    params: {
                        ...request
                    }
                }).then(response => {
                    resolve(response.data)
                }).catch(error => {
                    reject(error)
                    console.error('error: ',error)
                })
            }else if(api.type == 'post' || api.type == 'put'){
                //转换数据格式
                if(api.formData && api.type == 'post' ){
                    const formdata = new  FormData();
                    for (let i in request) {
                        formdata.append(i,request[i])
                    }
                    request = formdata;
                }
                return axios({
                    url: api.url,
                    method: api.type,
                    data: request,
                    headers: {
                        'Content-Type' : ' application/json;charset=UTF-8',
                        'X-Requested-With': 'XMLHttpRequest',
                        'Cache-Control' : 'no-cache'
                    }
                }).then(response => {
                    resolve(response.data)
                })
                .catch(error => {
                    reject(error)
                })
            }

        })
    }
}